#include <iostream>
#include <thread>
#include <mutex>
#include <condition_variable>
using namespace std;

int flag{false};
mutex m1;
condition_variable cv;

void foo()
{
    unique_lock<mutex> lock{m1};

    while (!flag)
    {
        // 执行 cv.wait(lock)：
        // – 内部先把 m1 解锁（让别的线程可以拿到锁）。
        // – 然后把线程自己挂起（阻塞），等待被“通知”,不消耗cpu资源
        // 通知后：
        // 1、继续获取锁
        // 2、判断条件是否成立：才会继续执行
        cv.wait(lock);
    }
    // C++ 对“条件变量 + 谓词”的语法糖写法，这个写法等价于while
    // cv.wait(lock,[](){return flag; });
    cout << "flag is  " << flag << endl;
}
void notify()
{
    unique_lock<mutex> lock{m1};
    flag = true;
    // 发送唤醒信号。实际运行条件不一定满足
    cv.notify_all(); // 通知所有
    // cv.notify_one(); // 通知一个
}
int main()
{
    thread t1(foo);
    thread t2(foo);
    this_thread::sleep_for(std::chrono::milliseconds(10));
    notify();

    t1.join();
    t2.join();
    return 0;
}

// 解决data rece问题
// 1、互斥锁
// 2、读写锁： 同一时间只允许一个写入，但是可以多个读取
// 3、条件变量
// 4、信号量
// 5、原子操作